#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
解题思路：从头节点开始进行元素删除，每删除一个元素，需要重新链接节点
* /
struct ListNode* removeElements(struct ListNode* head, int val) {
	if (head == NULL)
		return NULL;

	struct ListNode* cur = head;
	struct ListNode* prev = NULL;

	while (cur)
	{
		//如果当前节点是需要删除的节点
		if (cur->val == val)
		{
			//首先保存下一个节点
			struct ListNode* next = cur->next;
			//如果删除的为头节点，更新头节点
			//否则让当前节点的前趋节点链接next节点
			if (prev == NULL)
			{
				head = cur->next;
			}
			else
			{
				prev->next = cur->next;
			}
			//释放当前节点，让cur指向next
			free(cur);
			cur = next;
		}
		else
			/*
			解题思路： 此题一般常用的方法有两种，三指针翻转法和头插法
			1. 三指针翻转法
			   记录连续的三个节点，原地修改节点指向
			2. 头插法
			   每一个节点都进行头插
			*/
			// 三个指针翻转的思想完成逆置
			struct ListNode* reverseList(struct ListNode* head) {
			if (head == NULL || head->next == NULL)
				return head;

			struct ListNode* n1, * n2, * n3;
			n1 = head;
			n2 = n1->next;
			n3 = n2->next;
			n1->next = NULL;
			//中间节点不为空，继续修改指向
			while (n2)
			{
				//中间节点指向反转
				n2->next = n1;
				//更新三个连续的节点
				n1 = n2;
				n2 = n3;
				if (n3)
					n3 = n3->next;
			}
			//返回新的头
			return n1;
		}

		// 取节点头插的思想完成逆置
		struct ListNode* reverseList(struct ListNode* head) {
			struct ListNode* newhead = NULL;
			struct ListNode* cur = head;
			while (cur)
			{
				struct ListNode* next = cur->next;
				//头插新节点，更新头
				cur->next = newhead;
				newhead = cur;
				cur = next;
			}

			return newhead;
		}
